﻿Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.ComponentModel
Imports SIAVU.Persistencia

Namespace Dominio

    Public Class Usuario

#Region "Variables"

        Private _UsuarioID As Long
        Private _Roles As IList(Of Rol)
        Private _Telefonos As IList(Of Telefono)
        Private _PreProgramaciones As IList(Of Programacion)
        Private _PlanesVuelos As IList(Of Programacion)
        Private _ProgramacionesAsignadas As IList(Of Programacion)
        Private _VuelosRealizados As IList(Of Programacion)
        Private _AvionesPermitidos As IList(Of Avion)
        Private _Clave As String
        Private _Legajo As Long
        Private _NombreCompleto As String
        Private _TelefonosParaGuardia As String
        Private _TipoPosta As ETipoPosta
        Private _TipoUsuario As ETipoUsuario
        Private _Antiguedad As Integer
        Private Shared mInstance As Usuario

#End Region

#Region "Propiedades"

        Public Overridable Property UsuarioID() As Long
            Get
                Return _UsuarioID
            End Get
            Set(ByVal value As Long)
                _UsuarioID = value
            End Set
        End Property

        Public Overridable Property NombreCompleto() As String
            Get
                Return _NombreCompleto
            End Get
            Set(ByVal value As String)
                _NombreCompleto = value
            End Set
        End Property

        Public Overridable Property Legajo() As Long
            Get
                Return _Legajo
            End Get
            Set(ByVal value As Long)
                _Legajo = value
            End Set
        End Property

        Public Overridable Property TipoUsuario() As ETipoUsuario
            Get
                Return _TipoUsuario
            End Get
            Set(ByVal value As ETipoUsuario)
                _TipoUsuario = value
            End Set
        End Property

        Public Overridable Property PreProgramaciones() As IList(Of SIAVU.Dominio.Programacion)
            Get
                Return _PreProgramaciones
            End Get
            Set(ByVal value As IList(Of SIAVU.Dominio.Programacion))
                _PreProgramaciones = value
            End Set
        End Property

        Public Overridable Property ProgramacionesAsignadas() As IList(Of Programacion)
            Get
                Return _ProgramacionesAsignadas
            End Get
            Set(ByVal value As IList(Of Programacion))
                _ProgramacionesAsignadas = value
            End Set
        End Property

        Public Overridable Property PlanesVuelos() As IList(Of Programacion)
            Get
                Return _PlanesVuelos
            End Get
            Set(ByVal value As IList(Of Programacion))
                _PlanesVuelos = value
            End Set
        End Property

        Public Overridable Property VuelosRealizados() As IList(Of Programacion)
            Get
                Return _VuelosRealizados
            End Get
            Set(ByVal value As IList(Of Programacion))
                _VuelosRealizados = value
            End Set
        End Property

        Public Overridable Property AvionesPermitidos() As IList(Of Avion)
            Get
                Return _AvionesPermitidos
            End Get
            Set(ByVal value As IList(Of Avion))
                _AvionesPermitidos = value
            End Set
        End Property

        Public Overridable Property Roles() As IList(Of Rol)
            Get
                Return _Roles
            End Get
            Set(ByVal value As IList(Of Rol))
                _Roles = value
            End Set
        End Property

        Public Overridable Property Clave() As String
            Get
                Return _Clave
            End Get
            Set(ByVal value As String)
                _Clave = value
            End Set
        End Property

        Public Overridable Property TipoPosta() As ETipoPosta
            Get
                Return _TipoPosta
            End Get
            Set(ByVal value As ETipoPosta)
                _TipoPosta = value
            End Set
        End Property

        Public Overridable Property Antiguedad() As Integer
            Get
                Return _Antiguedad
            End Get
            Set(ByVal value As Integer)
                _Antiguedad = value
            End Set
        End Property

        Public Overridable Property Telefonos() As IList(Of Telefono)
            Get
                Return _Telefonos
            End Get
            Set(ByVal value As IList(Of Telefono))
                _Telefonos = value
            End Set
        End Property

        Public Overridable ReadOnly Property TelefonosParaGuardia() As String
            Get
                If Me.Telefonos IsNot Nothing AndAlso Me.Telefonos.Count > 0 Then
                    Dim sTelefonos As String = String.Empty
                    For Each oTelefono As Telefono In Me.Telefonos
                        If sTelefonos <> String.Empty Then
                            sTelefonos = sTelefonos + " - "
                        End If
                        sTelefonos = sTelefonos + oTelefono.TipoTelefono.ToString + ": " + oTelefono.Numero
                    Next
                    Return sTelefonos
                Else
                    Return String.Empty
                End If
                'Return _TelefonosParaGuardia
            End Get
        End Property

#End Region

#Region "Metodos"

        Public Shared Function getUsuarioByLegajo(ByVal legajo As Long) As Usuario
            '//Esta función recibe como parámetro legajo y clave, y en caso de encontrar un error lo devuelve

            Try
                Dim strResultado As String = ""
                Dim oUsuarioAux As Usuario
                Dim oListUsuario As List(Of Usuario)
                Dim oUsuarioPersistencia As New UsuarioPersistencia

                ''Obtengo usuarios según legajo (solo debería existir uno)
                oListUsuario = oUsuarioPersistencia.getByLegajo(legajo)

                '//Si hay mas de un usuario devuelvo nothing, y sino al usuario
                If oListUsuario.Count > 0 Then
                    oUsuarioAux = oListUsuario(0)
                Else
                    oUsuarioAux = Nothing
                End If

                Return oUsuarioAux

            Catch ex As Exception
                Throw
            End Try
        End Function

        Public Overridable Function getByID(ByVal UsuarioID As Long) As Usuario
            Try
                Dim oUsuarioAux As New Usuario
                oUsuarioAux.UsuarioID = UsuarioID

                Dim oUsuarioPersistencia As New UsuarioPersistencia
                oUsuarioPersistencia.getById(oUsuarioAux)

                If oUsuarioAux IsNot Nothing Then
                    Me.UsuarioID = oUsuarioAux.UsuarioID
                    Me.NombreCompleto = oUsuarioAux.NombreCompleto
                    Me.Legajo = oUsuarioAux.Legajo
                    Me.Clave = oUsuarioAux.Clave
                    Me.Antiguedad = oUsuarioAux.Antiguedad
                    Me.TipoUsuario = oUsuarioAux.TipoUsuario
                    Me.TipoPosta = oUsuarioAux.TipoPosta
                    Me.Telefonos = oUsuarioAux.Telefonos
                    Me.Roles = oUsuarioAux.Roles
                    Me.AvionesPermitidos = oUsuarioAux.AvionesPermitidos
                    Me.PlanesVuelos = oUsuarioAux.PlanesVuelos
                    Me.PreProgramaciones = oUsuarioAux.PreProgramaciones
                    Me.VuelosRealizados = oUsuarioAux.VuelosRealizados
                    Me.ProgramacionesAsignadas = oUsuarioAux.ProgramacionesAsignadas
                End If

                Return Me

            Catch ex As Exception
                Throw
            End Try
        End Function

        'Public Overridable Function getByID(ByVal UsuarioID As Long, ByRef Session As Object) As Usuario
        '    Try
        '        Dim oUsuarioAux As New Usuario
        '        oUsuarioAux.UsuarioID = UsuarioID

        '        Dim oUsuarioPersistencia As New UsuarioPersistencia
        '        oUsuarioPersistencia.getById(oUsuarioAux, Session)

        '        If oUsuarioAux IsNot Nothing Then
        '            Me.UsuarioID = oUsuarioAux.UsuarioID
        '            Me.NombreCompleto = oUsuarioAux.NombreCompleto
        '            Me.Legajo = oUsuarioAux.Legajo
        '            Me.Clave = oUsuarioAux.Clave
        '            Me.Antiguedad = oUsuarioAux.Antiguedad
        '            Me.TipoUsuario = oUsuarioAux.TipoUsuario
        '            Me.TipoPosta = oUsuarioAux.TipoPosta
        '            Me.Telefonos = oUsuarioAux.Telefonos
        '            Me.Roles = oUsuarioAux.Roles
        '            Me.AvionesPermitidos = oUsuarioAux.AvionesPermitidos
        '            Me.PlanesVuelos = oUsuarioAux.PlanesVuelos
        '            Me.PreProgramaciones = oUsuarioAux.PreProgramaciones
        '            Me.VuelosRealizados = oUsuarioAux.VuelosRealizados
        '            Me.ProgramacionesAsignadas = oUsuarioAux.ProgramacionesAsignadas
        '        End If

        '        Return Me

        '    Catch ex As Exception
        '        Throw
        '    End Try
        'End Function

        Public Shared Function getDescripcionTipoUsuario(ByVal TipoUsuarioID As ETipoUsuario) As String
            Select Case TipoUsuarioID
                Case ETipoUsuario.Auxiliar
                    Return "Auxiliar"
                Case ETipoUsuario.Comisario
                    Return "Comisario"
                Case ETipoUsuario.JefeCabina
                    Return "Jefe de Cabina"
                Case ETipoUsuario.Mesa
                    Return "Operador"
                Case ETipoUsuario.Programador
                    Return "Programador"
                Case Else
                    Return "Desconocido"
            End Select
        End Function

        Public Overridable Sub getHistorial()

        End Sub

        Public Overridable Sub getRoles()
            Dim oUsuarioPersistencia As New UsuarioPersistencia
            Me.Roles = oUsuarioPersistencia.getRoles(Me.UsuarioID)
        End Sub

        Public Overridable Function getAvionesPermitidos() As IList(Of Avion)
            Return Me.AvionesPermitidos
        End Function

        Public Overridable Function getPlanVuelo() As Programacion
            Return Nothing
        End Function

        Public Overridable Sub sacarGuardia()

        End Sub

        Public Overridable Function getActividadesProgramacionByPeriodo(ByVal UsuarioID As Long, ByVal Periodo As Date, ByVal TipoProgramacion As ETipoProgramacion, Optional ByVal objActividades As IList(Of Actividad) = Nothing) As IList(Of Actividad)
            Try
                If objActividades IsNot Nothing Then
                    Return objActividades
                Else
                    Me.UsuarioID = UsuarioID
                    Dim oProgramacion As Programacion

                    Select Case HttpContext.Current.Request.Url.AbsolutePath.ToUpper()
                        Case "/Presentacion/VerHistorial.aspx".ToUpper()
                            Dim oListActividades As New List(Of Actividad)
                            Dim oListActividadesAux As IList(Of Actividad) = Nothing

                            oProgramacion = getProgramacionByPeriodo(Periodo, ETipoProgramacion.ProgramacionAsignada)
                            If oProgramacion IsNot Nothing Then
                                oListActividadesAux = oProgramacion.getActividades()
                                If (oListActividadesAux IsNot Nothing AndAlso oListActividadesAux.Count > 0) Then
                                    For Each oActividad As Actividad In oListActividadesAux
                                        oActividad.DescripcionResource = "Programación Original"
                                        oListActividades.Add(oActividad)
                                    Next
                                End If
                            End If

                            oProgramacion = getProgramacionByPeriodo(Periodo, ETipoProgramacion.PlanVuelo)
                            If oProgramacion IsNot Nothing Then
                                oListActividadesAux = oProgramacion.getHistorialActividadesComoListaActividades()
                                If (oListActividadesAux IsNot Nothing AndAlso oListActividadesAux.Count > 0) Then
                                    For Each oActividad As Actividad In oListActividadesAux
                                        oListActividades.Add(oActividad)
                                    Next
                                End If
                            End If

                            oProgramacion = getProgramacionByPeriodo(Periodo, ETipoProgramacion.VueloRealizado)
                            If oProgramacion IsNot Nothing Then
                                oListActividadesAux = oProgramacion.getActividades()
                                If (oListActividadesAux IsNot Nothing AndAlso oListActividadesAux.Count > 0) Then
                                    For Each oActividad As Actividad In oListActividadesAux
                                        oActividad.DescripcionResource = "Vuelos Realizados"
                                        oListActividades.Add(oActividad)
                                    Next
                                End If
                            End If

                            oProgramacion = getProgramacionByPeriodo(Periodo, ETipoProgramacion.PreProgramacion)
                            If oProgramacion IsNot Nothing Then
                                oListActividadesAux = oProgramacion.getActividades()
                                If (oListActividadesAux IsNot Nothing AndAlso oListActividadesAux.Count > 0) Then
                                    For Each oActividad As Actividad In oListActividadesAux
                                        oActividad.DescripcionResource = "Mi Programación"
                                        oListActividades.Add(oActividad)
                                    Next
                                End If
                            End If

                            If (oListActividades.Count > 0) Then
                                Return oListActividades
                            Else
                                Return Nothing
                            End If

                        Case Else
                            oProgramacion = getProgramacionByPeriodo(Periodo, TipoProgramacion)
                            If oProgramacion IsNot Nothing Then
                                Return oProgramacion.getActividades()
                            Else
                                Return Nothing
                            End If

                    End Select
                End If

            Catch ex As Exception
                Throw
            End Try
        End Function

        Public Overridable Sub getProgramaciones(ByVal eTipoProgramacion As ETipoProgramacion)
            Dim objUsuarioPresistencia As New UsuarioPersistencia
            Select Case eTipoProgramacion
                Case Dominio.ETipoProgramacion.PlanVuelo
                    Me.PlanesVuelos = objUsuarioPresistencia.getProgramaciones(Me.UsuarioID, eTipoProgramacion)

                Case Dominio.ETipoProgramacion.PreProgramacion
                    Me.PreProgramaciones = objUsuarioPresistencia.getProgramaciones(Me.UsuarioID, eTipoProgramacion)

                Case Dominio.ETipoProgramacion.ProgramacionAsignada
                    Me.ProgramacionesAsignadas = objUsuarioPresistencia.getProgramaciones(Me.UsuarioID, eTipoProgramacion)

                Case Dominio.ETipoProgramacion.VueloRealizado
                    Me.VuelosRealizados = objUsuarioPresistencia.getProgramaciones(Me.UsuarioID, eTipoProgramacion)
            End Select
        End Sub

        'Public Overridable Sub getProgramaciones(ByVal eTipoProgramacion As ETipoProgramacion, ByRef Session As Object)
        '    Dim objUsuarioPresistencia As New UsuarioPersistencia
        '    Select Case eTipoProgramacion
        '        Case Dominio.ETipoProgramacion.PlanVuelo
        '            Me.PlanesVuelos = objUsuarioPresistencia.getProgramaciones(Me.UsuarioID, eTipoProgramacion, Session)

        '        Case Dominio.ETipoProgramacion.PreProgramacion
        '            Me.PreProgramaciones = objUsuarioPresistencia.getProgramaciones(Me.UsuarioID, eTipoProgramacion, Session)

        '        Case Dominio.ETipoProgramacion.ProgramacionAsignada
        '            Me.ProgramacionesAsignadas = objUsuarioPresistencia.getProgramaciones(Me.UsuarioID, eTipoProgramacion, Session)

        '        Case Dominio.ETipoProgramacion.VueloRealizado
        '            Me.VuelosRealizados = objUsuarioPresistencia.getProgramaciones(Me.UsuarioID, eTipoProgramacion, Session)
        '    End Select
        'End Sub

        Public Overridable Function getProgramacionByPeriodo(ByVal Periodo As Date, ByVal eTipoProgramacion As ETipoProgramacion) As Programacion
            Try
                Me.getProgramaciones(eTipoProgramacion)
                Return Me.FindProgramacionByPeriodo(Periodo, eTipoProgramacion)

            Catch ex As Exception
                Throw
            End Try
        End Function

        'Public Overridable Function getProgramacionByPeriodo(ByVal Periodo As Date, ByVal eTipoProgramacion As ETipoProgramacion, ByRef Session As Object) As Programacion
        '    Try
        '        Me.getProgramaciones(eTipoProgramacion, Session)
        '        Return Me.FindProgramacionByPeriodo(Periodo, eTipoProgramacion)

        '    Catch ex As Exception
        '        Throw
        '    End Try
        'End Function

        Public Overridable Function FindProgramacionByPeriodo(ByVal Periodo As Date, ByVal eTipoProgramacion As ETipoProgramacion) As Programacion
            Try
                Select Case eTipoProgramacion
                    Case Dominio.ETipoProgramacion.PlanVuelo
                        If Me.PlanesVuelos IsNot Nothing Then
                            If Me.PlanesVuelos.Count > 0 Then
                                For Each oPlanVuelo As Programacion In Me.PlanesVuelos
                                    If Periodo.Month = oPlanVuelo.Plazo.Mes AndAlso Periodo.Year = oPlanVuelo.Plazo.Anio Then
                                        Return oPlanVuelo
                                    End If
                                Next
                            End If
                        End If
                    Case Dominio.ETipoProgramacion.PreProgramacion
                        If Me.PreProgramaciones IsNot Nothing Then
                            If Me.PreProgramaciones.Count > 0 Then
                                For Each oPreProgramacion As Programacion In Me.PreProgramaciones
                                    If Periodo.Month = oPreProgramacion.Plazo.Mes AndAlso Periodo.Year = oPreProgramacion.Plazo.Anio Then
                                        Return oPreProgramacion
                                    End If
                                Next
                            End If
                        End If
                    Case Dominio.ETipoProgramacion.ProgramacionAsignada
                        If Me.ProgramacionesAsignadas IsNot Nothing Then
                            If Me.ProgramacionesAsignadas.Count > 0 Then
                                For Each oProgramacionAsignada As Programacion In Me.ProgramacionesAsignadas
                                    If Periodo.Month = oProgramacionAsignada.Plazo.Mes AndAlso Periodo.Year = oProgramacionAsignada.Plazo.Anio Then
                                        Return oProgramacionAsignada
                                    End If
                                Next
                            End If
                        End If
                    Case Dominio.ETipoProgramacion.VueloRealizado
                        If Me.VuelosRealizados IsNot Nothing Then
                            If Me.VuelosRealizados.Count > 0 Then
                                For Each oVueloRealizado As Programacion In Me.VuelosRealizados
                                    If Periodo.Month = oVueloRealizado.Plazo.Mes AndAlso Periodo.Year = oVueloRealizado.Plazo.Anio Then
                                        Return oVueloRealizado
                                    End If
                                Next
                            End If
                        End If
                End Select
                Return Nothing

            Catch ex As Exception
                Throw
            End Try
            Return Nothing
        End Function

        Public Overridable Sub deleteActividadEnPreProgramacion2(ByVal ActividadID As Long)
            ''NO ELIMINAR!!
            'Metodo necesario para definirlo en el ObjectDataSource del contro MiProgramacion
        End Sub

        Public Overridable Sub updateActividadEnPreProgramacion(ByVal ActividadID As Long, ByVal FechaInicio As DateTime, ByVal FechaFin As DateTime, ByVal Motivo As String, ByVal TipoActividadID As Integer, ByVal InformacionCompleta As String)
            ''NO ELIMINAR!!
            'Metodo necesario para definirlo en el ObjectDataSource del contro MiProgramacion
        End Sub

        Public Overridable Function ActualizarActividadesProgramacion(ByVal oListaActividadesActualizada As IList(Of Actividad), _
                                                                 ByVal oListaActividadesEliminadas As IList(Of Actividad), _
                                                                 ByVal Periodo As Date, _
                                                                 ByVal bFechasVariables As Boolean, _
                                                                 ByVal eTipoProgramacion As ETipoProgramacion) As Boolean
            Dim blnResultado As Boolean = False
            Try

                Me.getByID(Me.UsuarioID)
                Dim oProgramacion As Programacion
                oProgramacion = Me.getProgramacionByPeriodo(Periodo, eTipoProgramacion)

                Select Case eTipoProgramacion
                    Case Dominio.ETipoProgramacion.PreProgramacion
                        If oProgramacion Is Nothing Then
                            Dim oListaPreprogramacion As New List(Of Programacion)
                            oProgramacion = New Programacion
                            Dim oPlazo As New Plazo
                            oProgramacion.TipoProgramacion = eTipoProgramacion.PreProgramacion
                            oProgramacion.Plazo = oPlazo.getByFecha(Periodo)
                            oProgramacion.ProgramacionID = 0
                            oListaPreprogramacion.Add(oProgramacion)
                            Me.PreProgramaciones = oListaPreprogramacion
                        End If
                        oProgramacion.FechasVariables = bFechasVariables

                    Case Dominio.ETipoProgramacion.PlanVuelo
                        If oProgramacion Is Nothing Then
                            Dim oListaPlanesVuelo As New List(Of Programacion)
                            oProgramacion = New Programacion
                            Dim oPlazo As New Plazo
                            oProgramacion.TipoProgramacion = eTipoProgramacion.PlanVuelo
                            oProgramacion.Plazo = oPlazo.getByFecha(Periodo)
                            oProgramacion.ProgramacionID = 0
                            oListaPlanesVuelo.Add(oProgramacion)
                            Me.PlanesVuelos = oListaPlanesVuelo
                        End If
                        '//Si elimino actividades debo enviarlas al historial de actividades
                        If oListaActividadesEliminadas IsNot Nothing Then
                            CrearHistorialActividades(oProgramacion, oListaActividadesEliminadas)
                        End If
                End Select

                oProgramacion.Fecha = Date.Now '//Fecha de última modificación del usuario

                '//Actualizo la lista de actividades por la actual (la qeu esta en session)
                oProgramacion.Actualizar(oListaActividadesActualizada, oListaActividadesEliminadas, Me.TipoUsuario)

                '//Si llego hasta acá es por pudo hacer todo bien
                blnResultado = True

                Dim oUsuarioPersistencia As New UsuarioPersistencia
                oUsuarioPersistencia.ActualizarActividadesProgramacion(Me, oListaActividadesEliminadas, eTipoProgramacion, oProgramacion)

            Catch ex As Exception
                Throw

            End Try

            '//Devuelvo el resultado
            Return blnResultado
        End Function

        Private Sub CrearHistorialActividades(ByRef oProgramacion As Programacion, ByVal oListaActividadesEliminadas As IList(Of Actividad))
            Try
                Dim oHistorialActividad As HistorialActividad = Nothing
                oProgramacion.HistorialActividades = oProgramacion.getHistorialActividades
                Dim oUsuarioModificacion As New Usuario

                If oProgramacion.HistorialActividades Is Nothing Then
                    oProgramacion.HistorialActividades = New List(Of HistorialActividad)
                End If
                For Each oActividad As Actividad In oListaActividadesEliminadas
                    oHistorialActividad = New HistorialActividad
                    oHistorialActividad.Fecha = Date.Now
                    oHistorialActividad.Motivo = oActividad.Motivo
                    oHistorialActividad.UsuarioModificacion = oUsuarioModificacion.getByID(System.Web.HttpContext.Current.Session("UsuarioID"))
                    oHistorialActividad.TipoActividad = oActividad.TipoActividadID
                    If oActividad.TipoActividadID = ETipoActividad.Posta Then
                        oHistorialActividad.PostaID = DirectCast(oActividad, ActividadPosta).Posta.PostaID
                    End If
                    oHistorialActividad.FechaFin = oActividad.FechaFin
                    oHistorialActividad.FechaInicio = oActividad.FechaInicio
                    oHistorialActividad.EstadoActividad = oActividad.EstadoActividad


                    oProgramacion.HistorialActividades.Add(oHistorialActividad)
                Next

            Catch ex As Exception
                Throw
            End Try
        End Sub

        Private Sub CrearHistorialActividades(ByRef oProgramacion As Programacion, ByVal oActividad As Actividad)
            Try
                Dim oHistorialActividad As HistorialActividad = Nothing
                oProgramacion.HistorialActividades = oProgramacion.getHistorialActividades
                Dim oUsuarioModificacion As New Usuario

                If oProgramacion.HistorialActividades Is Nothing Then
                    oProgramacion.HistorialActividades = New List(Of HistorialActividad)
                End If
                oHistorialActividad = New HistorialActividad
                oHistorialActividad.Fecha = Date.Now
                oHistorialActividad.Motivo = oActividad.Motivo
                oHistorialActividad.UsuarioModificacion = oUsuarioModificacion.getByID(System.Web.HttpContext.Current.Session("UsuarioID"))
                oHistorialActividad.TipoActividad = oActividad.TipoActividadID
                If oActividad.TipoActividadID = ETipoActividad.Posta Then
                    oHistorialActividad.PostaID = DirectCast(oActividad, ActividadPosta).Posta.PostaID
                End If
                oHistorialActividad.FechaFin = oActividad.FechaFin
                oHistorialActividad.FechaInicio = oActividad.FechaInicio
                oHistorialActividad.EstadoActividad = oActividad.EstadoActividad


                oProgramacion.HistorialActividades.Add(oHistorialActividad)

            Catch ex As Exception
                Throw
            End Try
        End Sub

        Public Overridable Sub ConfimarVuelo(ByVal ActividadID As Long, ByVal blnRealizado As Boolean, ByVal Observacion As String, ByRef oList As List(Of Object))
            Try
                Dim oProgramacion As Programacion
                Dim oListActividadesAux As IList(Of Actividad) = Nothing
                Dim oActividadPersistencia As New ActividadPersistencia
                Dim oActividad As New ActividadPosta
                Dim oActividadAux As New ActividadPosta

                '//Obtengo la actividad a modificar
                oActividad.ActividadID = ActividadID
                oActividadPersistencia.getById(oActividad)

                Me.getByID(Me.UsuarioID)
                If (blnRealizado = True) Then
                    '//Le modifico el estado a la actividad a realizado y guardo en la BBDD
                    oActividad.EstadoActividad = EEstadoActividad.Realizado
                    oList.Add(oActividad)
                Else
                    '//Le modifico el estado a la actividad y guardo en la BBDD
                    oActividad.EstadoActividad = EEstadoActividad.NoRealizado
                    oList.Add(oActividad)

                    oProgramacion = Me.getProgramacionByPeriodo(Date.Now, ETipoProgramacion.PlanVuelo)

                    If oProgramacion Is Nothing Then
                        Dim oListaPlanesVuelo As New List(Of Programacion)
                        oProgramacion = New Programacion
                        Dim oPlazo As New Plazo
                        oProgramacion.TipoProgramacion = ETipoProgramacion.PlanVuelo
                        oProgramacion.Plazo = oPlazo.getByFecha(Date.Now)
                        oProgramacion.ProgramacionID = 0
                        oListaPlanesVuelo.Add(oProgramacion)
                        Me.PlanesVuelos = oListaPlanesVuelo
                    End If

                    '//Si elimino actividades debo enviarlas al historial de actividades
                    oProgramacion.Actividades = oProgramacion.getActividades()
                    Dim oActividadGuardia As ActividadGuardia = oProgramacion.findActividadByFecha(Date.Now)

                    oActividadGuardia.Motivo = "Guardia"
                    CrearHistorialActividades(oProgramacion, oActividadGuardia)
                    oProgramacion.Actividades.Remove(oActividadGuardia)
                End If

                '//Agrego la actividad a los vuelos realizados del usuario en cuestión
                oProgramacion = Me.getProgramacionByPeriodo(Date.Now, ETipoProgramacion.VueloRealizado)

                If oProgramacion Is Nothing Then
                    oProgramacion = New Programacion
                    oProgramacion.ProgramacionID = 0
                    oProgramacion.TipoProgramacion = ETipoProgramacion.VueloRealizado
                    oProgramacion.Fecha = Date.Now
                    oProgramacion.Plazo = Plazo.getByPeriodo(Date.Now.Year, Date.Now.Month) '//Siempre en este caso el período es el actual

                    Dim oListaVuelosRealizados As New List(Of Programacion)
                    oListaVuelosRealizados.Add(oProgramacion)
                    Me.VuelosRealizados = oListaVuelosRealizados
                End If

                oListActividadesAux = oProgramacion.getActividades()
                If (oListActividadesAux Is Nothing OrElse oListActividadesAux.Count = 0) Then
                    oListActividadesAux = New List(Of Actividad)
                End If

                oActividadAux = oActividad.Clonar()
                oActividadAux.ActividadID = 0
                oActividadAux.Observacion = Observacion
                oActividadAux.EstadoActividad = EEstadoActividad.Realizado
                oListActividadesAux.Add(oActividadAux)
                Me.VuelosRealizados(0).Actividades = oListActividadesAux

                oList.Add(Me)

            Catch ex As Exception
                Throw
            End Try
        End Sub

#End Region

    End Class

End Namespace

